import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import csv
import re
import os

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False

city_list = ['北京', '重庆', '上海', '天津', '成都',
             '三亚', '杭州', '武汉', '广州', '西安',
             '贵阳', '苏州', '昆明', '南京', '桂林',
             '张家界', '丽江', '哈尔滨', '拉萨', '长沙']
che =       [1, 0, 0, 1, 0,
             0, 0, 0, 0, 1,
             0, 0, 0, 0, 0,
             0, 0, 1, 0, 0]
# 城市名称
m = [1,2,3,4,5,6,7,8,9,10,11,12]
ji = [1,2,3,4]
y = [2018,2019,2020,2021,2022]
acont_j =    [[0, 0, 0, 0],  # 2018
              [0, 0, 0, 0],  # 2019
              [0, 0, 0, 0],  # 2020
              [0, 0, 0, 0],  # 2021
              [0, 0, 0, 0]]  # 2022
acont_m =    [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],  # 2018
              [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],  # 2019
              [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],  # 2020
              [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],  # 2021
              [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]  # 2022
acont_y = [0, 0, 0, 0, 0]
acost_t = [0, 0, 0, 0, 0]  # 旅行花费
acost_p = [0, 0, 0, 0, 0]  # 填写人数
sj = [0, 0, 0, 0]
nj = [0, 0, 0, 0]
for i in range(len(city_list)):
    # 我真的和py不熟
    cost_t = [0, 0, 0, 0, 0]  # 旅行花费
    cost_p = [0, 0, 0, 0, 0]  # 填写人数
    cont_m = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],  # 2018
              [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],  # 2019
              [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],  # 2020
              [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],  # 2021
              [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]  # 2022
    cont_j = [[0, 0, 0, 0],  # 2018
              [0, 0, 0, 0],  # 2019
              [0, 0, 0, 0],  # 2020
              [0, 0, 0, 0],  # 2021
              [0, 0, 0, 0]]  # 2022
    cont_y = [0, 0, 0, 0, 0]

    with open('./游记数据/' + city_list[i] + '/' + city_list[i] + '.csv', "r",encoding='gb18030') as csvfile:
        reader = csv.reader(csvfile)
        for line in reader:
            date=re.search(r'20\d\d-\d{1,}', str(line[1]))
            if date is None:
                continue
            else:
                date = date.group()
            year=int(re.search(r'20\d\d', str(date)).group())
            if year<2018 or year>2022:
                continue
            mont=re.search(r'-\d\d', str(date)).group()
            mont = int(re.search(r'\d\d', str(mont)).group())
            cont_m[year-2018][mont-1]=cont_m[year-2018][mont-1]+1
            acont_m[year - 2018][mont - 1] = acont_m[year - 2018][mont - 1] + 1
            if mont<=5 and mont>=3:
                cont_j[year - 2018][0] = cont_j[year - 2018][0] + 1
                acont_j[year - 2018][0] = acont_j[year - 2018][0] + 1
            if mont<=8 and mont>=6:
                cont_j[year - 2018][1] = cont_j[year - 2018][1] + 1
                acont_j[year - 2018][1] = acont_j[year - 2018][1] + 1
            if mont<=11 and mont>=9:
                cont_j[year - 2018][2] = cont_j[year - 2018][2] + 1
                acont_j[year - 2018][2] = acont_j[year - 2018][2] + 1
            if mont<=2 or mont>=12:
                cont_j[year - 2018][3] = cont_j[year - 2018][3] + 1
                acont_j[year - 2018][3] = acont_j[year - 2018][3] + 1
            cont_y[year - 2018]=cont_y[year - 2018]+1
            acont_y[year - 2018] = acont_y[year - 2018] + 1

            if mont == 12:
                cost=re.search(r'\d{1,}', str(line[3]))
                if cost is None:
                    continue
                else:
                    cost = int(cost.group())
                cost_p[year - 2018] = cost_p[year - 2018] + 1
                acost_p[year - 2018] = acost_p[year - 2018] + 1
                cost_t[year - 2018] = cost_t[year - 2018] + cost
                acost_t[year - 2018] = cost_t[year - 2018] + cost
    if os.path.exists('./结果/'+city_list[i]) == False:
        os.mkdir(r'./结果/'+city_list[i])
    res = open('./结果/'+city_list[i]+'/result.txt', mode='w')
    res.write(city_list[i] + '游记数据分析结果：\n')
    for j in range(5):
        ans=0
        loc=0
        res.write(str(2018+j)+'年游记总数为：'+str(cont_y[j])+'篇。\n')
        for k in range(12):
            if cont_m[j][k] > ans:
                ans=cont_m[j][k]
                loc=k
        res.write(str(2018+j)+'年'+str(loc+1)+'月旅游人数最多，游记数量为：'+str(ans)+'篇。\n')
        ans=0
        for k in range(4):
            if che[i] == 0:
                    sj[k]=sj[k]+cont_j[j][k]
            else:
                    nj[k]=nj[k]+cont_j[j][k]
            if cont_j[j][k] > ans:
                ans=cont_j[j][k]
                loc=k
        res.write(str(2018+j)+'年第'+str(loc+1)+'季度旅游人数最多，游记数量为：'+str(ans)+'篇。\n')
        if cost_p[j] != 0:
            res.write(str(2018+j)+'年12月游记数量为：'+str(cont_m[j][11])+'篇，总共花费为'+str(cost_t[j])+'元，平均每次旅游花费为：'+str(int(cost_t[j]/cost_p[j]))+'元。\n')
        else:
            res.write(str(2018+j)+'年12月游记数量为：'+str(cont_m[j][11])+'篇，消费水平未知。')

    fig = plt.figure(figsize=(13, 4), dpi=200)  # 新建画布
    ax1 = fig.add_subplot(111)  # 设置绘图区
    line1, = ax1.plot(m, cont_m[0], 'r', lw=1, label='2018')  # 创建折线
    line2, = ax1.plot(m, cont_m[1], 'b', lw=1, label='2019')
    line3, = ax1.plot(m, cont_m[2], 'c', lw=1, label='2020')
    line4, = ax1.plot(m, cont_m[3], 'g', lw=1, label='2021')
    line5, = ax1.plot(m, cont_m[4], 'k', lw=1, label='2022')
    # legend用来设置图例，还可以添加参数ncol=''，该参数用来设置图例的列数，用于对齐
    plt.legend((line1, line2, line3, line4, line5), ('2018', '2019', '2020', '2021', '2022'), loc='center left', frameon=False, framealpha=0.5)
    ax1.set_xlabel('月份/月')  # 设置x轴
    ax1.set_ylabel('热度（游记篇数）/篇')  # 设置左侧y轴
    plt.title(city_list[i] + '2018-2022年各月热度折线图')  # 设置图的名称
    fig.savefig('./结果/' + city_list[i] + '/' + city_list[i] + '2018-2022年各月热度折线图')

    fig = plt.figure(figsize=(5, 4), dpi=200)  # 新建画布
    ax1 = fig.add_subplot(111)  # 设置绘图区
    line1, = ax1.plot(ji, cont_j[0], 'r', lw=1, label='2018')  # 创建折线
    line2, = ax1.plot(ji, cont_j[1], 'b', lw=1, label='2019')
    line3, = ax1.plot(ji, cont_j[2], 'c', lw=1, label='2020')
    line4, = ax1.plot(ji, cont_j[3], 'g', lw=1, label='2021')
    line5, = ax1.plot(ji, cont_j[4], 'k', lw=1, label='2022')
    plt.legend((line1, line2, line3, line4, line5), ('2018', '2019', '2020', '2021', '2022'), loc='center left', frameon=False, framealpha=0.5)
    ax1.set_xlabel('季度')  # 设置x轴
    ax1.set_ylabel('热度（游记篇数）/篇')  # 设置左侧y轴
    plt.title(city_list[i] +'2018-2022年各季度热度折线图')  # 设置图的名称
    fig.savefig('./结果/' + city_list[i] + '/' + city_list[i] + '2018-2022年各季度热度折线图')

    fig = plt.figure(figsize=(6, 4), dpi=200)  # 新建画布
    ax1 = fig.add_subplot(111)  # 设置绘图区
    line1, = ax1.plot(y, cont_y, 'r', lw=1)  # 创建折线
    ax1.set_xlabel('年份')  # 设置x轴
    ax1.set_ylabel('热度（游记篇数）/篇')  # 设置左侧y轴
    plt.title(city_list[i] +'2018-2022年各年总热度折线图')  # 设置图的名称
    fig.savefig('./结果/' + city_list[i] + '/' + city_list[i] + '2018-2022年各年总热度折线图')

    fig = plt.figure(figsize=(6, 4), dpi=200)  # 新建画布
    ax1 = fig.add_subplot(111)  # 设置绘图区
    d12 = [cont_m[0][11],cont_m[1][11],cont_m[2][11],cont_m[3][11],cont_m[4][11]]
    line1, = ax1.plot(y, d12, 'r', lw=1)  # 创建折线
    ax1.set_xlabel('年份')  # 设置x轴
    ax1.set_ylabel('热度（游记篇数）/篇')  # 设置左侧y轴
    plt.title(city_list[i] +'2018-2022年12月热度折线图')  # 设置图的名称
    fig.savefig('./结果/' + city_list[i] + '/' + city_list[i] + '2018-2022年12月热度折线图')

    fig = plt.figure(figsize=(6, 4), dpi=200)  # 新建画布
    ax1 = fig.add_subplot(111)  # 设置绘图区
    line1, = ax1.plot(y, cost_t, 'r', lw=1)  # 创建折线
    ax1.set_xlabel('年份')  # 设置x轴
    ax1.set_ylabel('总消费/元')  # 设置左侧y轴
    plt.title(city_list[i] +'2018-2022年12月消费水平折线图')  # 设置图的名称
    fig.savefig('./结果/' + city_list[i] + '/' + city_list[i] + '2018-2022年12消费水平折线图')
    print(city_list[i] +'数据整理完成')

fig = plt.figure(figsize=(13, 4), dpi=200)  # 新建画布
ax1 = fig.add_subplot(111)  # 设置绘图区
line1, = ax1.plot(m, acont_m[0], 'r', lw=1, label='2018')  # 创建折线
line2, = ax1.plot(m, acont_m[1], 'b', lw=1, label='2019')
line3, = ax1.plot(m, acont_m[2], 'c', lw=1, label='2020')
line4, = ax1.plot(m, acont_m[3], 'g', lw=1, label='2021')
line5, = ax1.plot(m, acont_m[4], 'k', lw=1, label='2022')
# legend用来设置图例，还可以添加参数ncol=''，该参数用来设置图例的列数，用于对齐
plt.legend((line1, line2, line3, line4, line5), ('2018', '2019', '2020', '2021', '2022'), loc='center left', frameon=False, framealpha=0.5)
ax1.set_xlabel('月份/月')  # 设置x轴
ax1.set_ylabel('热度（游记篇数）/篇')  # 设置左侧y轴
plt.title('2018-2022年各月热度折线图')  # 设置图的名称
fig.savefig('./结果/2018-2022年各月热度折线图')

fig = plt.figure(figsize=(5, 4), dpi=200)  # 新建画布
ax1 = fig.add_subplot(111)  # 设置绘图区
line1, = ax1.plot(ji, acont_j[0], 'r', lw=1, label='2018')  # 创建折线
line2, = ax1.plot(ji, acont_j[1], 'b', lw=1, label='2019')
line3, = ax1.plot(ji, acont_j[2], 'c', lw=1, label='2020')
line4, = ax1.plot(ji, acont_j[3], 'g', lw=1, label='2021')
line5, = ax1.plot(ji, acont_j[4], 'k', lw=1, label='2022')
plt.legend((line1, line2, line3, line4, line5), ('2018', '2019', '2020', '2021', '2022'), loc='center left', frameon=False, framealpha=0.5)
ax1.set_xlabel('季度')  # 设置x轴
ax1.set_ylabel('热度（游记篇数）/篇')  # 设置左侧y轴
plt.title('2018-2022年各季度热度折线图')  # 设置图的名称
fig.savefig('./结果/2018-2022年各季度热度折线图')

fig = plt.figure(figsize=(6, 4), dpi=200)  # 新建画布
ax1 = fig.add_subplot(111)  # 设置绘图区
line1, = ax1.plot(y, acont_y, 'r', lw=1)  # 创建折线
ax1.set_xlabel('年份')  # 设置x轴
ax1.set_ylabel('热度（游记篇数）/篇')  # 设置左侧y轴
plt.title('2018-2022年各年总热度折线图')  # 设置图的名称
fig.savefig('./结果/2018-2022年各年总热度折线图')

fig = plt.figure(figsize=(6, 4), dpi=200)  # 新建画布
ax1 = fig.add_subplot(111)  # 设置绘图区
d12 = [acont_m[0][11],acont_m[1][11],acont_m[2][11],acont_m[3][11],acont_m[4][11]]
line1, = ax1.plot(y, d12, 'r', lw=1)  # 创建折线
ax1.set_xlabel('年份')  # 设置x轴
ax1.set_ylabel('热度（游记篇数）/篇')  # 设置左侧y轴
plt.title('2018-2022年12月热度折线图')  # 设置图的名称
fig.savefig('./结果/2018-2022年12月热度折线图')

fig = plt.figure(figsize=(6, 4), dpi=200)  # 新建画布
ax1 = fig.add_subplot(111)  # 设置绘图区
line1, = ax1.plot(y, acost_t, 'r', lw=1)  # 创建折线
ax1.set_xlabel('年份')  # 设置x轴
ax1.set_ylabel('总消费/元')  # 设置左侧y轴
plt.title('2018-2022年12月消费水平折线图')  # 设置图的名称
fig.savefig('./结果/2018-2022年12消费水平折线图')
print('数据整理完成')

res = open('./结果/result.txt', mode='w')
res.write('游记数据分析结果：\n')
cm = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
cj = [0, 0, 0, 0]
for i in range(12):
    cm[i]=acont_m[0][i]+acont_m[1][i]+acont_m[2][i]+acont_m[3][i]+acont_m[4][i]
for i in range(4):
    cj[i] = acont_j[0][i] + acont_j[1][i] + acont_j[2][i] + acont_j[3][i] + acont_j[4][i]
res.write('2018-2022年游记数为：\n')
ans=0
loc=0
for i in range(12):
    if cm[i] > ans:
        ans=cm[i]
        loc=i
res.write(str(loc+1)+'月旅游人数最多，游记数量为：'+str(ans)+'篇。\n')
ans=0
for i in range(4):
    if cj[i] > ans:
        ans=cj[i]
        loc=i
res.write('第'+str(loc+1)+'季度旅游人数最多，游记数量为：'+str(ans)+'篇。\n')
res.write('北方城市各季度游记数量为：\n'+str(nj[0])+'\n'+str(nj[1])+'\n'+str(nj[2])+'\n'+str(nj[3])+'\n')
res.write('南方城市各季度游记数量为：\n'+str(sj[0])+'\n'+str(sj[1])+'\n'+str(sj[2])+'\n'+str(sj[3])+'\n')